package com.zhenxiang.juc.lock.productComsumer;

/**
 * @Author : James
 * @Create : 2021-12-21-10:47
 * @Description :  生产者消费者 互相通讯 Synchronized 版
 *
 *   线程之间通讯问题：生产者和消费者问题 等待唤醒 通知唤醒
 *   线程交替执行  线程A 线程B 操作同一变量num = 0
 *    A 线程+1
 *    B 线程-1
 */
public class ProductConsumerSynchronized1 {

    public static void main(String[] args) {

        // 线程任务
         Data  data = new Data();

         new Thread(()->{
             for (int i = 0; i < 10; i++) {
                 try {
                      // 加法
                     data.increment();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         },"A").start();


         new Thread(()->{
             for (int i = 0; i < 10; i++) {
                 // 减法
                 try {
                     data.decrement();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         },"B").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    // 加法
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                // 减法
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();


    }
}


// 资源类
class  Data {

    private int num =0;

    // 自增 +1
    public synchronized  void  increment() throws InterruptedException {
        while (num != 0) {
            this.wait();
        }
        num ++;
        System.out.println(Thread.currentThread().getName()+"===>"+num);
        // 通知唤醒其他线程执行任务
        this.notifyAll();
    }

    // 自减 -1
    public synchronized void decrement() throws InterruptedException {
        while (num ==0) {
            this.wait();
        }
        num--;
        System.out.println(Thread.currentThread().getName()+"===>"+num);
        // 通知唤醒其他线程执行任务
        this.notifyAll();
    }

}
